# 6 方案2：分步抓取 - 猎聘（https://www.liepin.com）招聘职位
import requests
from bs4 import BeautifulSoup
import csv, time

headers = {
    'Host': 'www.liepin.com',
    'Referer': 'https://www.liepin.com/',
    # 注意：这里 cookie 不是真实的，真实的 cookie 需要你通过 chrome 开发者工具，从要抓取的网页复制过来
    'cookie': 'abtest=0; __uuid=1576550127589.19; Hm_lvt_a2647413544f5a04f00da7eee0d5e200=1576550129; fe_se=-1576551876002; __tlog=1576550127591.38%7C00000000%7CR000000075%7C00000000%7C00000000; JSESSIONID=05F87D07E8DD0451EE2D5BC22007C62B; _fecdn_=1; char_captcha=16E6F970C0A84405A3C97C56725CCC96; __session_seq=37; __uv_seq=2; Hm_lpvt_a2647413544f5a04f00da7eee0d5e200=1576637239',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36',
}

url = 'https://www.liepin.com/zhaopin/?sfrom=click-pc_homepage-centre_searchbox-search_new&d_sfrom=search_fp&key=python'

for i in range(3): # 这里抓取了 3 次，可以把 3 改成自己需要的次数

    # 每抓取一页就保存下抓取结果，避免中途程序失败抓取的内容还没有保存
    with open('zhaopin_liepin.csv', 'a', encoding='utf-8') as f:
        f_csv = csv.writer(f)

        time.sleep(3)  # 限制抓取时的频率
        print(headers, url, '=================================================================')
        print()

        req = requests.get(url, headers=headers) # requests.get 请求

        headers['Referer'] = url # 更新字典 headers 中的键 Referer

        soup = BeautifulSoup(req.text, 'lxml')  # 初始化一个 BeautifulSoup 对象

        page_div = soup.find('div', class_='container sojob-search').find_next_sibling('div')
        items = page_div.ul.find_all("li") # 所有招聘列表信息都在 <li> 标签中

        current_page = page_div.find('div', class_='pager').find(class_='pagerbar').find('a', class_='current') # 底部的当前页面的位置
        url = 'https://www.liepin.com' + current_page.find_next_sibling('a')['href'] # 找到下一页的 url，作为下次爬取列表页的 url

        for item in items: # 遍历招聘列表
            job_main = item.find('div', class_='sojob-item-main clearfix')
            job_info = job_main.find('div', class_='job-info')
            company_info = job_main.find('div', class_='company-info')

            a = job_info.h3.a # 详情页的 <a> 标签
            href = a['href'] # 详情页的 href
            if 'www.liepin.com' not in href: # href 有可能是相对地址，这种情况手动加上 'www.liepin.com'
                href = 'https://www.liepin.com' + href

            data_promid = a['data-promid'] # <a> 标签中的 data，请求时要和 href 拼接在一起

            title = a.get_text(strip=True) # 招聘职位

            # 招聘要求的列表，例：c_list = ['18-36k·14薪', '北京', '本科及以上', '3年以上']
            c_list = job_info.find('p', class_='condition clearfix')['title'].split('_')

            company_a = company_info.find('p', class_='company-name').a
            company_name = company_a.text # 招聘的公司名称
            try:
                company_url = company_a['href'] # 公司 url
            except:
                company_url = '' # 如果没有公司 url，就为空字符

            print(href, data_promid)

            # 2 抓详细页
            try:
                time.sleep(3)  # 限制抓详细页的频率

                url_detail = href + '?' + data_promid # 拼接抓取的 url

                req_detail = requests.get(url_detail, headers=headers)

                r_text = req_detail.text

                # 先看看抓取的文本中有无 '职位描述'，如果没有，说明没有获取正确内容
                if '职位描述' not in r_text:
                    print(r_text)

                soup = BeautifulSoup(r_text, 'lxml')
                # 找到 职位详细描述
                detail = soup.find('div', class_='job-item main-message job-description').div.get_text('\n', strip=True)
            except:
                print('detail error')
                detail = ''

            # 把一个公司的所有信息组成一个列表
            line = [href, title, c_list[0], c_list[1], c_list[2], c_list[3], company_name, company_url, detail]
            print(line)
            f_csv.writerow(line)

print('写入完成')